package cn.itcast.service.cargo.impl;

import cn.itcast.dao.cargo.ContractDao;
import cn.itcast.dao.cargo.ContractProductDao;
import cn.itcast.dao.cargo.ExtCproductDao;
import cn.itcast.domain.cargo.*;
import cn.itcast.service.cargo.ContractProductService;
import cn.itcast.vo.ContractProductVo;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;


import java.util.Date;
import java.util.List;
import java.util.UUID;

@Service
public class ContractProductServiceImpl implements ContractProductService {

    @Autowired
    private ContractProductDao contractProductDao;

    @Autowired
    private ContractDao contractDao;

    @Autowired
    private ExtCproductDao extCproductDao;

    /*
        货物分页查询
     */
    @Override
    public PageInfo<ContractProduct> findByPage(ContractProductExample contractProductExample, int pageNum, int pageSize) {

        PageHelper.startPage(pageNum,pageSize);

        //查询数据
        List<ContractProduct> contractProductList = contractProductDao.selectByExample(contractProductExample);

        //得到货物页面
        PageInfo<ContractProduct> pageInfo = new PageInfo<>(contractProductList);


        return pageInfo;
    }

    /*
     货物条件查询
  */
    @Override
    public List<ContractProduct> findAll(ContractProductExample contractProductExample) {
        List<ContractProduct> contractProductList = contractProductDao.selectByExample(contractProductExample);
        return contractProductList;
    }

      /*
        根据id查询货物
    */

    @Override
    public ContractProduct findById(String id) {

        return contractProductDao.selectByPrimaryKey(id);
    }


   /*
      添加货物
  */

    @Override
    public void save(ContractProduct contractProduct) {

        contractProduct.setId(UUID.randomUUID().toString());

        //有两个字段不能为空
        contractProduct.setCreateTime(new Date());
        contractProduct.setUpdateTime(new Date());


//        1. 计算货物的总价
        double amount =0;

        //由于cnumber与price我们都使用包装类所以可以使用null去判断
        if (contractProduct.getCnumber()!=null && contractProduct.getPrice()!=null){

           amount = contractProduct.getCnumber()*contractProduct.getPrice();

           contractProduct.setAmount(amount);
        }
//        2. 插入货物的数据
        contractProductDao.insertSelective(contractProduct);

//        3. 重新计算购销合同的总价  购销合同总价= 购销合同原价格+货物的总价
        Contract contract = contractDao.selectByPrimaryKey(contractProduct.getContractId());
        System.err.println("contract"+contract);

        if (contract.getTotalAmount()!=null){
            contract.setTotalAmount(contract.getTotalAmount()+amount);
        }else {
            //该购销合同是第一次添加货物
            contract.setTotalAmount(amount);
        }

        //        4. 更新购销合同的种类数量  购销合同的种类数量 = 购销合同的原种类数量+1
        if (contract.getProNum()!=null){
            contract.setProNum(contract.getProNum()+1);
        }else {
            contract.setProNum(1);
        }
//        5. 更新购销合同
        contractDao.updateByPrimaryKeySelective(contract);


    }

    /*
    更新货物
     */
    public void update(ContractProduct contractProduct) {
        //更新之前查询该货物的对象
        ContractProduct oldContractProduct = contractProductDao.selectByPrimaryKey(contractProduct.getId());

        //修改更新的时间

        contractProduct.setUpdateTime(new Date());

        //        1. 计算货物的总价
        double amount = 0;
        //由于cnumber与price我们都使用包装类所以可以使用null去判断
        if (contractProduct.getCnumber() != null && contractProduct.getPrice() != null){
            amount = contractProduct.getCnumber() * contractProduct.getPrice();
            contractProduct.setAmount(amount);
        }
        //        2. 更新货物数据
        contractProductDao.updateByPrimaryKeySelective(contractProduct);

        //        3. 重新计算购销合同的总价   购销合同总价 = 购销合同原价格- 货物原本价格+ 当前的新总价

        Contract contract = contractDao.selectByPrimaryKey(contractProduct.getContractId());
        contract.setTotalAmount(contract.getTotalAmount() - oldContractProduct.getAmount() + amount);

        //        4. 更新购销合同
        contractDao.updateByPrimaryKeySelective(contract);


    }

     /*
    根据主键删除货物
     */

    @Override
    public void delete(String id) {
        //找到被删除货物
        ContractProduct dbcontractProduct = contractProductDao.selectByPrimaryKey(id);

        //        1. 删除货物
        contractProductDao.deleteByPrimaryKey(id);
        contractProductDao.deleteByPrimaryKey(id);
//        2. 删除该货物对应的附件
        //找到货物对应的附件
        ExtCproductExample extCproductExample = new ExtCproductExample();
        //条件：该货物的附件
        extCproductExample.createCriteria().andContractProductIdEqualTo(id);
        List<ExtCproduct> extCproductList = extCproductDao.selectByExample(extCproductExample);

        //遍历附件，逐个删除
        double totalExtAmount =0;
        if (extCproductList!=null){
            for (ExtCproduct extCproduct : extCproductList) {
                //把附件的总价统计
                totalExtAmount+=extCproduct.getAmount();
                extCproductDao.deleteByPrimaryKey(extCproduct.getId());
            }
        }

        //        3.  更新购销合同的总价   更新购销合同 = 购销合同原总价-被删除货物的总价- 附件的总价
        Contract contract = contractDao.selectByPrimaryKey(dbcontractProduct.getContractId());
        contract.setTotalAmount(contract.getTotalAmount()-dbcontractProduct.getAmount()-totalExtAmount);



        //        4. 更新购销合同的货物数量
        contract.setProNum(contract.getProNum()-1);

        //        5. 更新购销合同的附件数量
        if (extCproductList!=null){
            contract.setExtNum(contract.getExtNum()-extCproductList.size());
        }

        //        6. 更新购销合同
        contractDao.updateByPrimaryKeySelective(contract);


    }

    //出货表的sql
    @Override
    public List<ContractProductVo> findByShipTime(String shipTime,String companyId) {

        return contractProductDao.findByShipTime(shipTime,companyId);
    }
}
